home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 46
/
Amiga Format CD46 (1999-10-20)(Future Publishing)(GB)[!][issue 1999-12].iso
/
-in_the_mag-
/
reader_requests
/
scilab
/
bin
/
dold
< prev
next >
Wrap
Text File
|
1999-09-16
|
2KB
|
84 lines
#!/bin/sh5
OBJNM=/tmp/objnm$$
JMPTAB=/tmp/jmptab$$
# Separons les .o des autres arguments
while test $# -ge 1; do
case $1 in
-r) OPTARG="$OPTARG -N";;
-G) case $2 in 0) shift;; *) OPTARG="$OPTARG $1";; esac;;
-A) BASEBIN=$2; shift;;
*.o) OBJARG="$OBJARG $1";;
-o) OPTARG="$OPTARG $1"; OUTBIN=$2;;
-e) ENTRY=$2; shift;;
*) OPTARG="$OPTARG $1";;
esac
shift; done
SCITXTNM=$BASEBIN.txtnm
SCIDATNM=$BASEBIN.datnm
# Si les fichiers de table des symboles n'existent pas, tentons
# de les creer.
{ test -f $SCITXTNM && test -f $SCIDATNM; } ||
{ nm $BASEBIN > $BASEBIN.nm &&
{ grep ' T ' $BASEBIN.nm > $SCITXTNM
grep ' [A-SU-Z] ' $BASEBIN.nm > $SCIDATNM
rm $BASEBIN.nm
}
}
# Si les fichiers de table des symboles n'existent tojours pas,
# inutile de continuer
{ test -f $SCITXTNM && test -f $SCIDATNM; } || exit 1
# Creons la liste des symboles indefinis de ces .o
nm -u $OBJARG | sed -n '/^ *U /s///p' | sort -u > $OBJNM
# Creons l'intersection de cette liste avec celle des symboles de scilab
# et produisons un source assembleur qui definit ces symboles et cres
# les branchements indirects
grep ' A _gp$' $SCIDATNM | (read ADDR SKIP; echo ".lowgp=0x$ADDR" >>$JMPTAB.s)
join -j1 1 -j2 3 -o 2.3 2.1 $OBJNM $SCITXTNM | \
while read NAME ADDR
do cat <<EOF
.$NAME=0x$ADDR
.globl $NAME
1: .word 0
$NAME: sw \$31,1b
la \$8,.$NAME
li \$28,.lowgp
jal \$8
lw \$31,1b
la \$28,_gp
j \$31
EOF
done >> $JMPTAB.s
# Ajoutons le code de commutation de gp
cat >>$JMPTAB.s <<EOF
savra: .word 0
.globl $ENTRY
.globl .$ENTRY
.$ENTRY:
sw \$31,savra
la \$28,_gp
jal $ENTRY
lw \$31,savra
la \$28,.lowgp
j \$31
EOF
echo " .data" >>$JMPTAB.s
# Ajoutons des definitions pour les symboles de data
join -j1 1 -j2 3 -o 2.3 2.1 $OBJNM $SCIDATNM | \
while read NAME ADDR
do echo ".globl $NAME;$NAME=0x$ADDR"
done >> $JMPTAB.s
# Assemblons le resultat
as $JMPTAB.s -o $JMPTAB.o
# Y a plus qu'a faire l'edition de liens
ld $OBJARG $JMPTAB.o $OPTARG -e .$ENTRY
# sauvons le status
STATUS=$?
rm $JMPTAB.[so] $OBJNM
# c'est correct si le link s'est bien passe et qu'il nde reste pas
# d'indefini(s).
test $STATUS -eq 0 && STATUS=`nm -u $OUTBIN | wc -l` && { test $STATUS -eq 0 || { echo $STATUS undefined:;nm -u $OUTBIN; }; }
exit $STATUS